package com.taotao.portal.service.impl;

import com.taotao.common.CookieUtils;
import com.taotao.common.HttpUtil;
import com.taotao.common.JsonUtils;
import com.taotao.common.TaotaoResult;
import com.taotao.pojo.TbItem;
import com.taotao.portal.pojo.CartItem;
import com.taotao.portal.service.CartService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service
public class CartServiceImpl implements CartService {
    //服务url
    @Value("${rest.url}")
    private String restBaseUrl;

    /**
     * 添加购物车商品
     *
     * @param itemId
     * @param request
     * @param response
     * @return
     */
    @Override
    public List<CartItem> add(Long itemId, HttpServletRequest request, HttpServletResponse response) {
        List<CartItem> cartItemList = new ArrayList<>();
        if (itemId == null) {
            return cartItemList;
        }
        //取cookie中购物车商品列表
        loadItemListFromCookie(cartItemList, request);
        //将用户选择的商品添加到购物车
        add2Cart(cartItemList, itemId);
        //把新的购物车信息写入cookie中
        CookieUtils.setCookie(request, response, "TT_CART", JsonUtils.objectToJson(cartItemList), true);
        return cartItemList;


    }

    /**
     * 添加商品到购物车
     *
     * @param cartItemList
     * @param itemId
     */
    private void add2Cart(List<CartItem> cartItemList, Long itemId) {
        //根据商品id查询商品信息
        String json = HttpUtil.doGet(restBaseUrl + "/item/get_item_detail/" + itemId);
        //转换成taotaoResult
        TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, TbItem.class);
        if (taotaoResult != null && taotaoResult.getStatus().equals(200)) {
            TbItem tbItem = (TbItem) taotaoResult.getData();
            //如果购物车中已有此商品.将购物车中此商品的数量+1
            boolean isExits = false;
            for (CartItem cartItem : cartItemList) {
                if (tbItem.getId().equals(cartItem.getId())) {
                    cartItem.setNum(cartItem.getNum() + 1);
                    isExits = true;
                }
            }
            //如果购物车中没有此商品,把此商品加入购物车,数量设置为1
            if (!isExits) {
                CartItem cartItem = new CartItem();
                cartItem.setId(tbItem.getId());
                cartItem.setNum(1);
                cartItem.setImages(tbItem.getImage() == null ? new String[0] : tbItem.getImage().split(","));
                cartItem.setPrice(tbItem.getPrice());
                cartItem.setTitle(tbItem.getTitle());
                cartItemList.add(cartItem);
            }
        }
    }

    /**
     * 从购物车中获取已有商品列表
     * @param cartItemList
     * @param request
     */
    private void loadItemListFromCookie(List<CartItem> cartItemList, HttpServletRequest request) {
        try {
            String json = CookieUtils.getCookieValue(request, "TT_CART", true);
            if (!StringUtils.isBlank(json)){
                List<CartItem> cookieCartItemList = JsonUtils.jsonToList(json, CartItem.class);
                cartItemList.addAll(cookieCartItemList);
            }
        } catch (Exception e) {
            log.error("从Cookie中获取商品列表出错",e);
        }
    }

    /**
     * 获取购物车中商品列表
     * @param request
     * @return
     */
    @Override
    public List<CartItem> getCartList(HttpServletRequest request) {
        List<CartItem> cartItemList = new ArrayList<>();
        loadItemListFromCookie(cartItemList,request);
        return cartItemList;
    }

    /**
     * 删除购物车中的商品
     * @param itemId
     * @param request
     * @param response
     * @return
     */
    @Override
    public List<CartItem> deleteCart(Long itemId, HttpServletRequest request, HttpServletResponse response) {
        List<CartItem> cartItemList = new ArrayList<>();
        loadItemListFromCookie(cartItemList,request);
        //找到购物车中的商品,并删除之
        for (CartItem cartItem : cartItemList){
            if (cartItem.getId().longValue() == itemId.longValue()){
                cartItemList.remove(cartItem);
                break;
            }
        }
        //更新cookie中购物车数据
        CookieUtils.setCookie(request,response,"TT_CART",JsonUtils.objectToJson(cartItemList),true);
        return cartItemList;
    }

    /**
     * 修改指定商品的数量
     * @param itemId
     * @param num
     * @param request
     * @param response
     * @return
     */
    @Override
    public TaotaoResult changeCartItemNum(Long itemId, Integer num, HttpServletRequest request, HttpServletResponse response) {
        List<CartItem> cartItemList = new ArrayList<>();
        loadItemListFromCookie(cartItemList,request);
        //从商品列表中找到要修改数量的商品
        for (CartItem cartItem : cartItemList){
            Long cartItemId = cartItem.getId();
            if (cartItemId.equals(itemId)){
                //找到商品,修改数量
                cartItem.setNum(num);
                break;
            }
        }
        //把商品信息写入cookie
        CookieUtils.setCookie(request,response,"TT_CART",JsonUtils.objectToJson(cartItemList),true);
        return TaotaoResult.ok();
    }
}
